# @Time    :2025/3/28 13:05
"""
该案例演示了global和nonlocal关键字
"""

"""
#通过+= 赋值操作，就会报错，它认为还没有定义局部变量val1
val1 = 10
def func():
    val1 += 10
    print(val1)
func()
"""

val2=10
def func_c():
    #这里的global是声明：当前在局部作用域中使用全局变量val2
    global val2
    val2=20
    print(f"局部作用域中的var2={val2,id(val2)}")
func_c()
print(f"全局作用域中的var2={val2,id(val2)}")

print("-------------------------------------------")
var1 = 10
def func():
    # 声明：当前在局部作用域中使用全局的变量 var1
    global var1
    var1 = 20
    print(f"glo局部作用域中的var1={var1,id(var1)}")
func()
print(f"glo全局作用域中的var1={var1,id(var1)}")

#---------------------list----------------------------
list1=[1,2,3,5]
def func():
    list1[0]=10#list是可变的，在原本的list1的 基础上做修改
    print(f"局部作用域中的list1={list1, id(list1)}")#list1=([10, 2, 3, 5], 2789204058240)

func()
print(f"全局作用域中的list1={list1, id(list1)}")#list1=([10, 2, 3, 5], 2789204058240)

#---------------------list----------------------------
list1=[1,2,3,5]
def func():
#    global list1 #开启global 意味着 局部变量使用到全局
    list1[0]=10#list是可变的，在原本的list1的 基础上做修改
#    list1=[11,3,4,5] #这样相当于新建了一个list1
#   [0]=1  1ist1=([1, 2, 3, 5], 2423974984448)
    print(f"list局部作用域中的list1={list1, id(list1)}")#list1=([3, 4, 5], 2789204058240)

func()
print(f"list全局作用域中的list1={list1, id(list1)}")#list1=([1, 2, 3, 5], 2789205605120)

#---------------------tuple---是不可变的,----------------------

# tuple1=(1,2,3,5)
# def func():
#     tuple1[0]=10#tuple是不可变的，这里不行，就不能对全局的tuple1 做修改
#     print(f"tuple1={tuple1, id(tuple1)}")
#
# func()
# print(f"tuple1={tuple1, id(tuple1)}")

#---------------------tuple---------------------------

tuple1=(1,2,3,5)
def func():
    tuple1 = (1, 2, 3, 5)
    tuple1*=2
    print(f"tuple1={tuple1, id(tuple1)}")

func()

print(f"tuple1={tuple1, id(tuple1)}")
#--------------------------------------------------------
# list1=[1,2,3,5]
# def outer():
#     list1[0]=10
#     print(list1)
#     def fun():
#         return fun
# a=func()
# print(a)


#------

def outer():
    var1=10
    def inner():
        #嵌套作用域
        #nonlocal var1
        var1=20
        print(f"局部作用域中的var1={var1, id(var1)}")#var1=(20, 140732936750600)
    inner()
    print(f"嵌套作用域中的var1={var1, id(var1)}")#var1=(20, 140732936750600)


outer()